home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / inet / inet_addr.c < prev    next >
C/C++ Source or Header  |  1988-07-25  |  3KB  |  112 lines

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that this notice is preserved and that due credit is given
  7.  * to the University of California at Berkeley. The name of the University
  8.  * may not be used to endorse or promote products derived from this
  9.  * software without specific prior written permission. This software
  10.  * is provided ``as is'' without express or implied warranty.
  11.  */
  12.  
  13. #if defined(LIBC_SCCS) && !defined(lint)
  14. static char sccsid[] = "@(#)inet_addr.c    5.5 (Berkeley) 3/7/88";
  15. #endif /* LIBC_SCCS and not lint */
  16.  
  17. #include <sys/types.h>
  18. #include <ctype.h>
  19. #include <netinet/in.h>
  20.  
  21. /*
  22.  * Internet address interpretation routine.
  23.  * All the network library routines call this
  24.  * routine to interpret entries in the data bases
  25.  * which are expected to be an address.
  26.  * The value returned is in network order.
  27.  */
  28. u_long
  29. inet_addr(cp)
  30.     register char *cp;
  31. {
  32.     register u_long val, base;
  33.     int n;
  34.     register char c;
  35.     u_long parts[4], *pp = parts;
  36.  
  37. again:
  38.     /*
  39.      * Collect number up to ``.''.
  40.      * Values are specified as for C:
  41.      * 0x=hex, 0=octal, other=decimal.
  42.      */
  43.     val = 0; base = 10;
  44.     if (*cp == '0') {
  45.         if (*++cp == 'x' || *cp == 'X')
  46.             base = 16, cp++;
  47.         else
  48.             base = 8;
  49.     }
  50.     while (c = *cp) {
  51.         if (isdigit(c)) {
  52.             val = (val * base) + (c - '0');
  53.             cp++;
  54.             continue;
  55.         }
  56.         if (base == 16 && isxdigit(c)) {
  57.             val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
  58.             cp++;
  59.             continue;
  60.         }
  61.         break;
  62.     }
  63.     if (*cp == '.') {
  64.         /*
  65.          * Internet format:
  66.          *    a.b.c.d
  67.          *    a.b.c    (with c treated as 16-bits)
  68.          *    a.b    (with b treated as 24 bits)
  69.          */
  70.         if (pp >= parts + 4)
  71.             return (INADDR_NONE);
  72.         *pp++ = val, cp++;
  73.         goto again;
  74.     }
  75.     /*
  76.      * Check for trailing characters.
  77.      */
  78.     if (*cp && !isspace(*cp))
  79.         return (INADDR_NONE);
  80.     *pp++ = val;
  81.     /*
  82.      * Concoct the address according to
  83.      * the number of parts specified.
  84.      */
  85.     n = pp - parts;
  86.     switch (n) {
  87.  
  88.     case 1:                /* a -- 32 bits */
  89.         val = parts[0];
  90.         break;
  91.  
  92.     case 2:                /* a.b -- 8.24 bits */
  93.         val = (parts[0] << 24) | (parts[1] & 0xffffff);
  94.         break;
  95.  
  96.     case 3:                /* a.b.c -- 8.8.16 bits */
  97.         val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) |
  98.             (parts[2] & 0xffff);
  99.         break;
  100.  
  101.     case 4:                /* a.b.c.d -- 8.8.8.8 bits */
  102.         val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) |
  103.               ((parts[2] & 0xff) << 8) | (parts[3] & 0xff);
  104.         break;
  105.  
  106.     default:
  107.         return (INADDR_NONE);
  108.     }
  109.     val = htonl(val);
  110.     return (val);
  111. }
  112.